#@layoutT('表格编辑')
#define main()
	<table class="layui-hide" id="tableId" lay-filter="tableEvent"></table>
	<!-- 表头工具栏 -->
   	<script type="text/html" id="table_toolbar_1">
		<div class="layui-btn-group">
			<button class="layui-btn layui-btn-normal layui-btn-sm" id="add_btn_1" type="button">
	 				<i class="layui-icon">&#xe608;</i> 新增
			</button>
			<button class="layui-btn layui-btn-normal layui-btn-sm" id="save_btn_1" type="button">
	 				<i class="layui-icon">&#xe605;</i> 保存
			</button>
		</div>
	</script>
	<!-- 	每行的操作按钮 -->
	<script type="text/html" id="table_rowbar_1">
  		<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del_btn_1">删除</a>
	</script>	
#end

#define js()
<script>
//查询初始化表格数据
function getTableData(table){
	$.ajax({
		url: '#(path)/static/libs/ext/tableEditData.json',
	    type:"GET", 
	    data: {},
	    dataType : 'json', 
	    success:function(res){
		    console.log(res)
		    table.reload('tableId',{
				data:res.data 
			});
	    }	
	});
}

layui.extend({
	tableEdit: '#(path)/static/libs/ext/tableEdit',
}).use(['table','tableEdit','layer'], function () {
        var table = layui.table,tableEdit = layui.tableEdit,$ = layui.$;
        var params = [{value:1,name:"张三1"},{value:2,name:"张三2"},{value:3,name:"张三3"},{value:4,name:"张三4"},{value:5,name:"张三5"}];
      	//初始化表格数据
        getTableData(table);
        
         var cols = table.render({
            elem: '#tableId'
            //,url:'#(path)/static/libs/ext/data.json'
            ,height: 'full-90'
            ,toolbar:'#table_toolbar_1'
            ,page: true
            ,limit:20
            ,cols: [[
                {type:'checkbox'}
                ,{title:'序号',type:'numbers',width:35}
                //type的类型值：select（下拉框）date（时间选择框）input(输入框)
                //input为输入框，失去焦点会触发回调，aopTable.on()中触发的回调
                ,{field:'name',title: '输入框',width:120,event:'name',config:{type:'input'}}
                //data 为下拉框数据
                ,{field:'danxuan',align:'center', title: '单选',width:120
                    ,event:'danxuan',config:{type:'select',data:params}
                    ,templet:function (d) {
                        if(d.danxuan){
                            if(d.danxuan.name){
                                return  d.danxuan.name;
                            }
                            return  d.danxuan;
                        }
                        return ''
                    }
                }
                //  enabled => true：多选，false：单选。默认为false
                ,{field:'duoxuan', title: '多选',width:120,event:'duoxuan'
                    ,config:{type:'select',data:params,enabled:true}
                    ,templet:function (d) {
                        var str = [];
                        d.duoxuan.forEach(function (e) {
                            str.push(e.name)
                        });
                        return str.join(' || ');
                    }
                }
                //dateType表示日期时间格式，date为“yyyy-MM-dd”
                // ，datetime为“yyyy-MM-dd HH:ss:mm”
                ,{field:'birthday', title: '生日',width:120,event:'birthday'
                    ,config:{type:'date',dateType:'date'}}
                //cascadeSelectField字段为级联开关字段(存在该字段则级联，否则不级联)
                ,{field:'xlkjl', title: '下拉框联动(上级)',width:150,event:'xlkjl',
                    config:{type:'select',data:params,cascadeSelectField:'xialaxiaji'}
                    ,templet:function (d) {
                    return d.xlkjl && d.xlkjl.name ? d.xlkjl.name : '';
                }}
                ,{field:'xialaxiaji', title: '下拉框联动(下级)',width:150,event:'xiaji'
                    ,config:{type:'select',data:params},templet:function (d) {
                    return d.xialaxiaji && d.xialaxiaji.name ? d.xialaxiaji.name : '';
                }}
                ,{field:'rqjl', title: '日期联动(上级)',width:150,event:'rqjl'
                    ,config:{type:'date',dateType:'date',cascadeSelectField:'rqxiaji'}}
                ,{field:'rqxiaji', title: '日期框联动(下级)',width:150,event:'rqxiaji'
                    ,config:{type:'select',data:params},templet:function (d) {
                    return d.rqxiaji && d.rqxiaji.name ? d.rqxiaji.name : '';
                }}
                ,{fixed: 'right', title:'操作', toolbar: '#table_rowbar_1',width:100 }
            ]]
        	,done: function (res, curr, count) {
				var editTableData = res.data;

				// 添加一行
				$("#add_btn_1").unbind("click");
				$("#add_btn_1").click(function (){
					var rowData={
							"id":1,
							"name":"张三1",
							"danxuan":null,
							"duoxuan":[{"value":1,"name": "张三1"},{"value":2,"name": "张三2"}],
							"birthday":"",
							"xlkjl": null, 
							"rqjl": "",
							"xialaxiaji":null,
							"rqxiaji":null
					};
					editTableData.push(rowData);
					console.log(editTableData)
					table.reload("tableId",{
					    data:editTableData   // 将新数据重新载入表格		    
					});
				});	
				// 保存数据
				$("#save_btn_1").unbind("click");
				$("#save_btn_1").click(function (){
					console.log(editTableData)
					var saveUrl="";//TODO
					submitData(saveUrl,{"tableList":JSON.stringify(editTableData)});
				});	
	        }
        }).config.cols;  
                
        /**
         * 参数cols是table.render({})中的cols属性值
         * aop代理是基于event点击事件进行操作的，
         * 因此cols中务必开启event点击事件！
         **/
        var aopTable = tableEdit.aopObj(cols); //获取一个aop对象
        /**
         * 注意：
         * 1、 aopTable.on('tool(xxx)',function (obj) {})
         * 2、 table.on('tool(yyy)',function (obj) {})
         * 如果1中的xxx与2中的yyy字符串相同时，
         * 不能同时用，用了会造成后调用者覆盖前调用者。
         * 应该直接用1来代替2，因为1中包含了2中的事件。
         * 如果不相同，则可以同时使用。
         **/
        aopTable.on('tool(tableEvent)',function (obj) {
            var field = obj.field; //单元格字段
            var value = obj.value; //修改后的值
            var data = obj.data; //当前行旧数据
            var event = obj.event; //当前单元格事件属性值
            var update = {};
            update[field] = value;
            //把value更新到行中
            obj.update(update);
            /**
             *说白了，此obj与table.on('tool(tableEvent)',function (obj) {})
             *中的obj对象是同一个，所以可以如此操作。
             *
             * */

          //2、删除监听
 	    	// 当前操作的数据的索引
 	    	var nowIndex = parseInt(getQuotationVal(obj.tr.selector)[0]);
 	    	if(obj.event === "del_btn_1"){
 	        	var confirmIndex = layer.confirm('您确定要删除吗?',{btn: ['确定', '取消'],title:"提示"}, function(){
 		       		var editTableData=layui.table.cache["tableId"].deleteOne(nowIndex);
 			 		table.reload("tableId",{data:editTableData}); // 重新渲染表格
 			 		layer.close(confirmIndex); // 关闭弹窗
 				});
 	        }
        });


        /**
         * 级联下拉框 => 点击事件生成下拉框之前的回调函数
         * 主要用于 => 动态获取单元格下拉数据
         * tableEvent => table的lay-filter属性值
         * 如示例代码所示
         */
        tableEdit.on('clickBefore(tableEvent)',function (obj) {
            var cascadeSelectData = obj.data; //级联数据
            var cascadeSelectField = obj.field; //级联字段
            if(Array.isArray(cascadeSelectData)){
                cascadeSelectData = cascadeSelectData[0];
            }
            var result = {
                data:[{name:1,value:'语文'},{name:2,value:'数学'},{name:3,value:'英语'},{name:4,value:'物理'},{name:5,value:'化学'}],
                enabled:false //单选 true为多选
            };
            var result1 = {
                data:[{name:6,value:'政治'},{name:7,value:'地理'},{name:8,value:'历史'},{name:9,value:'生物'},{name:10,value:'音乐'}],
                enabled:false //单选 true为多选
            };
            //这里用定时器来模拟异步操作，同步操作直接return即可。
            setTimeout(function () {
                if(cascadeSelectField === 'rqjl'){
                    tableEdit.callbackFn("async(tableEvent)",result1);
                }else {
                    tableEdit.callbackFn("async(tableEvent)",result);
                }
            },500);
        });
    });

	//提交数据
	function submitData(url,tableTata){
			$.ajax({
				url: url,  
			    type:"post", 
			    data: tableTata,
			    success:function(res){
			    	layer.msg(res.msg||"保存成功")    
			    }	
			});
	}

	// 给数组添加一个方法，delete方法接受一个参数，根据参数删除数组的一个元素，返回一个删除对应索引元素的新数组，不改变原有数组
 	Array.prototype.deleteOne=function(delIndex){
 		var temArray=[];
 		for(var i=0;i<this.length;i++){
 			if(i!=delIndex){
 	    		temArray.push(this[i]);
 			}
 		}
 		return temArray;
 	}
 	
 	// 获取双引号""中的值
 	function getQuotationVal(str) {
 	    var result = str.match(/\"\w*\"/g);
 	    return result.map(function(element){
 	        return element.replace(/\"/g, '');
 	    });
 	}
</script>
#end